package eventos.aceptar;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JOptionPane;

import logica.Jerarquia;
import logica.JerarquiaException;
import logica.SinNombreException;
import memento.IMemento;

import controlador.IObjDelModConRefExternaEntidad;
import controlador.NoExisteEntidadGraficable;

import vista.objetos.JerarquiaGraficable;
import vista.objetos.ProyectoGraficable;
import vista.paneles.NingunElementoSeleccionadoException;
import vista.ventanas.VentanaJerarquia;

public class EventoAceptarJerarquiaEditada  extends MouseAdapter {
	
	private VentanaJerarquia ventana;
	private IObjDelModConRefExternaEntidad controlador;
	private JerarquiaGraficable jerarquiaGraf;
	
	public EventoAceptarJerarquiaEditada(VentanaJerarquia ventana, IObjDelModConRefExternaEntidad controlador, JerarquiaGraficable jerarquiaGraf)
	{
		super();
		this.ventana = ventana;
		this.controlador = controlador;
		this.jerarquiaGraf = jerarquiaGraf;
	}
	
	public void mouseClicked(MouseEvent e)
	{
		IMemento memento = this.controlador.getGraficableEditando();
		ProyectoGraficable proyecto = this.controlador.getProyectoActual();

		try 
		{
			/*actualización de la jerarquia lógica*/
			this.ventana.getJerarquia(); 
			/*si se modificaron las entidades hijas chequea que existan esas entidades en todos los diagramas
			 * donde haya una copia de dicha jerarquia graficable
			 * El padre no lo chequeo porque no está permitido editarlo*/
			proyecto.verificarSiEntidadesEstan(((Jerarquia)this.jerarquiaGraf.getObjetoDiagramaDecorado()).getEntidadesEspecializadas(), this.jerarquiaGraf);
			/*si la verificación da que puede aceptarse los cambios, entonces, actulizo todos los graficables
			 * de esta jerarquia*/
			proyecto.agregarEntidadesGraficablesATodasLasJerarquiasCopias(this.jerarquiaGraf);
			
			this.controlador.actualizarVista();
			
			//si hasta este punto no saltó ninguna excepción entonces guardo el estado anterior para deshacer
			this.controlador.guardarMemento(memento);
			this.controlador.sacarGraficableEditando();

			this.ventana.setVisible(false);
			this.ventana = null;	
		}
		catch (NoExisteEntidadGraficable e1)
		{
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Entidad inexistente", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		}
		catch (JerarquiaException e1) 
		{
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Error al editar la Jerarquia", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		}
		catch (SinNombreException e1)
		{ //se supone que nunca debería pasar.
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Error al editar la Jerarquia", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		}
		catch (NingunElementoSeleccionadoException e1) 
		{
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Error al editar la Jerarquia", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		}	
	}
}
